Spring Cloud Config漏洞分析(CVE-2019-3799、CVE-2020-5405)

spring cloud config是spring cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持。

Spring-Cloud-Config

先抛出三个问题:

  1. 什么是微服务?
  2. 什么是Spring Cloud?
  3. 什么是Spring Cloud Config?

对于微服务的理解:

1
https://www.zhihu.com/question/65502802/answer/802678798

Spring Cloud:

Spring Boot 让我们从繁琐的配置文件中解脱了出来,而 Spring Cloud,它我们提供了一整套的微服务解决方案,大大的降低了微服务开发的门槛,同时也减少了开发成本。Spring Cloud并不是特指某个框架,它其实是一系列成熟框架的组合,使用的主要技术栈如下(图片是在网上找的,但随着技术的发展,目前有些Spring Cloud指定的技术组件停止了更新,进入了被动维护。但也有新的更好的替代者出现,如配置中心服务,Config是官方推荐组件,Nacos是阿里巴巴开源组件,目前在Spring Cloud孵化器中孵化,孵化成功后,将成为Spring Cloud官方推荐的组件之一,国内成功的案例有阿里,虎牙,爱奇艺等):

16d1b00653b25d09

Spring Cloud Config:

spring cloud configspring cloud团队创建的一个全新项目,用来为分布式系统中的基础设施和微服务应用提供集中化的外部配置支持。

CVE-2019-3799

漏洞公告

1
https://tanzu.vmware.com/security/cve-2019-3799

image-20200504144804217

环境搭建

这里分析的版本为:Spring Cloud Config 2.1.1

源码下载地址:

1
https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.1.1.RELEASE

在命令行运行:

1
2
$ cd spring-cloud-config-server
$ ../mvnw spring-boot:run

在IDEA中运行:

Reimportmaven依赖,然后运行spring-cloud-config-server文件下的ConfigServerApplication.java文件。

访问本地8888端口看是否正常搭建:

image-20200504145437595

漏洞复现

任意文件读取漏洞,尝试读取C:\Windows\win.ini文件:

1
http://127.0.0.1:8888/a/b/master/..%252F..%252F..%252F..%252F..%252F..%252FWindows%252Fwin.ini

image-20200504145605364

漏洞分析

根据Spring Cloud Config手册上的描述:

配置服务器通过/{name}/{profile}/{label}/{path}中的附加端点提供这些服务,其中“name”,“profile”和“label”的含义与常规环境端点相同,但“path”是文件名(例如log.xml )。

首先服务器通过配置文件指定远程的github仓库,然后通过rest接口来读取仓库中的配置文件信息,如读取logtest.yml文件:

image-20200505195343200

name用来指定名称,profile指定当前策略,label来指定版本,因为logtest.yml文件并没有名称和策略信息,可随意指定:

image-20200505195638748

通过源码查看对于/{name}/{profile}/{label}请求的处理逻辑:

image-20200505201049732

获取的参数会传入getFilePath函数处理,跟进getFIilePath函数:

image-20200506134110961

经过getFilePath函数处理,最终获取所需要读取到文件名,接着进入retrieve函数,跟进retrieve函数:

image-20200506134454301

通过代码看出,通过函数findOne来获取最终读取的配置文件(logtest.yml),并返回Resource接口,跟进findOne函数:

image-20200506140225030

image-20200506140326813

文件名可控,因此直接构造../(注意编码)就可进行目录穿越造成任意文件读取。

CVE-2019-3799-补丁

补丁地址:

1
https://github.com/spring-cloud/spring-cloud-config/commit/3632fc6f64e567286c42c5a2f1b8142bfde505c2

image-20200507144109812

在补丁中主要增加了isInvalidPathisInvalidEncodedPath函数,增加了对路径的检测。

isInvalidPath函数处理逻辑如下:

image-20200507150732668

isInvalidEncodedPath函数处理逻辑如下:

image-20200507151047117

processPath函数代码如下:

image-20200507152222567

image-20200507162530155

CVE-2020-5405

漏洞的利用有一定的局限性,需要修改配置文件,从本地获取配置文件,不适用于git的情况。

漏洞公告

1
https://tanzu.vmware.com/security/cve-2020-5405

image-20200509180906145

环境搭建

这里分析的版本为:Spring Cloud Config 2.2.0

源码下载地址:

1
https://github.com/spring-cloud/spring-cloud-config/releases/tag/v2.2.0.RELEASE

下载好源码后需要修改src\main\resources\configserver.yml文件,将策略改为nativa,至于为什么修改,接下来将进行分析。

1
2
3
4
5
6
7
8
9
spring:
profiles:
active: native
cloud:
config:
server:
native:
search-locations:
- file:///F:/dir/config-repos/mrcode/dirr

配置文档:

1
https://zq99299.github.io/note-book/spring-cloud-tutorial/config/002.html#%E6%96%87%E4%BB%B6%E7%B3%BB%E7%BB%9F%E5%90%8E%E7%AB%AF

漏洞复现

任意文件读取漏洞,尝试读取C:\Windows\win.ini文件:

1
http://127.0.0.1:8888/a/b/..(_)..(_)..(_)..(_)..(_)..(_)Windows/win.ini

image-20200510163047464

漏洞分析

CVE-2019-3799的补丁可有效阻止基于path的路径穿越攻击,通过本次的利用方式可以看出,漏洞的触发点并不在path处,而是在label处。

image-20200510163920725

通过源码看出,label参数经过了resolveLabel函数处理,跟进resolveLabel函数:

image-20200510164043694

可以看出,如果label参数中存在(_),将会被替换为/,因label参数可控,只需要将(_)通过参数传入,经过代码处理后文件路径边可以控制。

image-20200510164428812

代码默认从git端读取信息,如果采用默认方式,当label指定版本的不存在时会报500错误,报错信息如下:

image-20200510172457884

通过报错信息可以知道,在经过checkout函数时存在了异常:

image-20200510172840687

当更改为本地获取配置信息时,如果读取的文件不带后缀,也会报500错误,因此通过/etc/passwd做漏洞检测时,虽然漏洞存在,但也会报错。

CVE-2020-5405-补丁

补丁地址:

1
https://github.com/spring-cloud/spring-cloud-config/commit/651f458919c40ef9a5e93e7d76bf98575910fad0

新增了isInvalidEncodedLocation函数对location进行了检测,逻辑与对path检测的逻辑大致相同。

image-20200510174009638

Reference

1
2
https://xz.aliyun.com/t/7558
https://xz.aliyun.com/t/4844
Author: Sys71m
Link: https://www.sys71m.top/2020/05/10/Spring Cloud Config漏洞分析(CVE-2019-3799、CVE-2020-5405)/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.